@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@W!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu }NA5W (c)1983 Action Computer Services  B JKIHiDiELV`LA*} A BLV`LAAl LA &` Fj`8冨凪` BEӅӥ+} B`ʆǪƩ Ɛee` *BƦʆǢ &Ɛeǐ NB NBLB *B'&&&8儨児,}祂*LB&&*ń8&&LB B`hihiHHȱȱLAc !#3`-}LAJJJJ`H Ah`Hȩh AL;C AL;C oAL;C wAL;C }AH8.}`HhHh CL;C BHI V䅠L;C LC AL;CԆ ؠPIPP`/} DP wAL;C 7DLC DL}ȌzK0zKu{KLK}KȌ|KyKKK|K}KLK|K}KLKzK{KLK`LK FLK ˠҢK C ~K`6WLL?}KKKLLD:*.000L mK*(mKLELD:*.001Lȑ= mK*(mKLmLD:*.002Lȑe mK@}*(mKLLD:*.003Lȑ mK*(mKLLD:*.004Lȑ mK*(mKLLD:*.005Lȑ݈ mK*(mKA}L MD:*.006Mȑ mK*(mKL5MD:*.007Mȑ- mK*(mKL]MD:*.008MȑU mK*(mKLMB}D:*.009Mȑ} mK*(mKLMD:*.010MȑK mK*(mKȱJ- H`LMM MLM`HC}M L CJ- _CH`L NJA CJi CNAJHNHNNLNNAJI L}NJNAJAJ -HJJAD} HLNNL=NNiJNNNLNNiJI LNJNiJiJ -HJJi HLNNLN`LN VF1,J0+J+Ji,E}JiG+Ji,Ji+Ji ,Ji+Ji ,JiNNLcO+JmN,JiNL=O`LiO NF}HH B GLOO C FLOANTICO C FLOSOFTWAREO C G}FLP O C FL5P P' C  FJA C  FJi C FLP H}Ph C FLP"Press for Screen, for PrinterP C CLPK:PΩ _CI}@ CeOeOIP eOISLP FL8Q$ Q C CeO`LOQJQJQISLaQ`J} FLQPRESS FOR CONTINOUS FEEDQm C FLQPRESS FOR SINGLE SHEETQ C CLQK:Qé _C@K} CKQKQIS KQICLQ FL&R R C FLWR R9 CL} CKQ`LoRjRiRkRHICL.SjRiR FLRàR C CLRK:Ré _C CM}kRkRILR CkR`jRiR FL"S S C C`L:S ȢIc GHcIH͖HN}LjSH C`3S8HSS3SLT8H3S5S5SH4S4SI L T6SHSS6SLS5Sm6SH6ScI6SLS85SO}H8H5ScIH CIcH HHi5S5S`3SLxSH C`L$TTTTTTHDTDTTLT C T TIP}L_TLTLsT TI TILsTLT TTHTL9T8TH T`LTTTTT MTTILTT`TLUTQ} !TT 7STHTILTHITIL7UHI8L7UHT8H"U"U͓TL.U DTLUTiH7͙HLUT ͓TR}L[U DTLFUH  lRTTILU CT`LU͙HLUHILUH lRT} CTILU CT`LT S}CT`LU FLUҠӠԠ΢U C ~K`L VAVAVJAJA J MV NVH fOVV LT}QVVH CVIPLV8HPHH CLVP:V~ _Cd͗HLV C UL%WLVH$H CLVE:U}V _C CVV TVVIL W lRVLWLWVILWLWLWVLVL%WLSVL2VVAVA``VVE:x888888ffffff~~`~~fl0fF>6xo~{>>888>|||f<Z}c6>8pp8?[}w><~~~<||`x`~<~~<\}0~0 ~ <~~<~~f~``~~f~~~``~~~f~~f~`~~~~f~~``~~ff8888<>>``f||f88<<w]}wk~~fff~~ff~~~f~``~~f~~~```~`~~~~fff~~ff~<ckwf~<~fff~~~~~0~<~~<^}~x|ngTTTTTT~f~``~~f~~~```~`~~~~fff~~ff~<ckwf~<~fff~~~~~0~<~~<The Floating Point Packageby Louis J. Chorich IIIThis documentation may not be copied, photocopied, reproduced, translated `}, or telecommunicated in any form, in whole or in part, without the prior written consent of Antic Publishing, Inc.The acco a}mpanying program material may not be duplicated, in whole or in part, for any purpose. No copies of the floppy disk(s) may b b}e sold or given to any person or other entity.Notwithstanding the above, the documentation and accompanying disk(s) may be c}duplicated for the sole use of the original purchaser.Antic is a trademark of Antic Publishing, Inc.MAC/65 and DOS-XL are '}OVERVIEWThe Floating Point Macro Library is designed to take advantage of the tremendous macro capabilities of the MAC/65 e}Macro Assembler produced by Optimized Systems Software. The Library is a programming tool intended to provide an interface bf}etween the programmer and the floating point routines built into the Atari ROM. Though assembly language provides only the cg}apability to operate on integers, the use of the FP library allows a programmer to perform computations on numbers in the ranh}ge of 10^-98 to 10^98. All computations are accurate to nine or ten digits depending upon the operation performed.Includedi} in the FP Library are the following capablities: Addition 2 Byte Integer to FP Conversion Subtractij}on FP to 2 Byte Integer Conversion Multiplication ASCII String to FP Conversion Division k} FP to ASCII String Conversion Natural Logarithm Input FP number from keyboard Base 10 Logarithm Prl}int FP Number to Screen Exponentiation Comparison of Two FP Numbers Inverse Logarithms FP Array Managemm}ent Square Root Move FP Numbers Branching upon Comparison of two FP NumbersThe capabilities of the Trin}g library are contained in a separate section at the end of this documentation.Included on the Library disk are eight fileso}, FP.LIB, FPANNOT.LIB, FPDEMO.M65, MSG.M65, FPDEMO.COM, TRIG.LIB, TRIGDEMO.M65, and TRIGDEMO.COM. The FPANNOT.LIB file contap}ins the fully commented source code while the FP.LIB file has the comments removed. FP.LIB functions identically to FPANNOT.q}LIB but occupies less disk space. FPDEMO.COM is the binary file produced by FPDEMO.M65 and MSG.M65. MSG.M65 is a part of thr}e demo program. TRIG.LIB is the Trigonometric macros. TRIGDEMO.M65 and TRIGDEMO.COM are the source and object code of the ps}rogram which demonstrates the use of the Trig macros. The Library disk is unprotected. You may make copies for your own uset} only.This manual assumes that you are somewhat familiar with 6502 assembly language programming as well as the use of the u}MAC/65 Macro Assembler.SYSTEM REQUIREMENTS 48K Atari Computer Disk Drive MAC/65 Macro AssemblerGETTING v}STARTEDIn order to use the FP Library in your own programs, you first must .INCLUDE the FP.LIB or FPANNOT.LIB file in yourw} source code. The best way to accomplish this is illustrated in the following example: 100 *=$4000 ;START Ox}F CODE 110 JMP MYCODE 120 .INCLUDE #D:FP.LIB 130 ;YOU CAN INCLUDE ANY OTHER MACRO FILES YOU HAVE RIGHT HEREy} 140 MYCODE 150 ;YOUR PROGRAM STARTS HERENote the JMP MYCODE instruction in line 110. It is necessary that this z}is the first line after you indicate the address where assembly begins. If line 110 were not present, the first thing the pr{}ogram would do when run is execute code inside the FP library and certainly crash.It might be mentioned that floating point|} numbers are stored in memory as six byte quantities. Every floating number requires six bytes of memory, no matter how smal}}l or large the value of the number.THE FLOATING POINT MACRO LIBRARYThere are 25 macros in the FP library. They provid~}e a complete interface to the Atari FP routines in ROM. FPADD LN FPI INPUTFP FPCOMP FPSUB } LOG IFP PRINTFP BIGT FPMUL EXP AFP GETEL BILT FPDIV EXP10 FA}SC PUTEL BIEQ FPMOVE EXPON SQR XXPUSH XXPULLFPADD Syntax: FPADD adr1, adr2, adr}3 Purpose: To add two FP numbers.Parameters: adr1 - address of an FP number adr2 - another FP number } adr3 - the FP result of the sum of the two numbers Example: FPADD REAL1,REAL2,RESULTThe FP number at REAL1 is added }to the FP number at REAL2, and the result is stored at RESULT. REAL1 and REAL2 remain intact.FPSUB Syntax: FPSUB adr}1,adr2,adr3 Purpose: To subtract two FP numbers.Parameters: adr1 - address of an FP number adr2 - address of }another FP number adr3 - the FP sum of the two numbers Example: FPSUB REAL1,REAL2,RESULTThe FP number at REA}L2 is subtracted from the FP number at REAL1 and the result is stored at RESULT. REAL1 and REAL2 remain intact.FPMUL } Syntax: FPMUL adr1,adr2,adr3 Purpose: To multiply two FP numbers.Parameters: adr1 - address of a FP number a}dr2 - address of another FP number adr3 - address of the FP product Example: FPMUL AA,BB,XXThe FP number at }AA will be multiplied by the FP number at BB and the FP product will be stored at XX. AA and BB remain intact.FPDIV }Syntax: FPDIV adr1,adr2,adr3 Purpose: To divide one FP number by another.Parameters: adr1 - address of the FP dividend } adr2 - address of the FP divisor adr3 - address at which to store the FP result Example: FPDIV MILES},GALLONS,MILAGEThe FP number at MILES will be divided by the FP number at GALLONS and the result will be stored at MILAGE. } MILES and GALLONS remain intact.INPUTFP Syntax: INPUTFP adr Purpose: To get a FP number as input from the keyboa}rd.Parameters: adr - address at which to store the six byte number entered at the keyboard Example: INP}UTFP REALThis macro waits for input from the keyboard, converts it to floating point notation, and stores it at address REA}L. Memory starting at LBUFF ($580) is used as a buffer for keyboard input. Be careful! Any data in LBUFF may be overwritte}n!PRINTFP Syntax: PRINTFP adr Purpose: To print a floating point number on the screen.Parameters: adr - address }of the FP number to print Example: PRINTFP REALPRINTFP is the complement of INPUTFP. PRINTFP takes the FP number at REA}L, converts it to an ASCII string starting at LBUFF, and prints it to the screen. Like INPUTFP, PRINTFP uses LBUFF for works}pace. Make sure that area of memory is free.LN Syntax: LN adr1,adr2 Purpose: To take the natural logarithm of a }FP number.Parameters: adr1 - address of the FP number whose natural logarithm will be computed } adr2 - address where the result will be stored Example: LN REAL1,REAL2The natural log of the FP number at REAL1 will b}e computed and stored as a FP number at REAL2.LOG Syntax: LOG adr1,adr2 Purpose: To take the base 10 logarithm of} an FP number.Parameters: adr1 - address of the FP number whose base 10 logarithm will be computed } adr2 - address where the result will be stored Example: LOG REAL1,REAL2The base 10 log of the FP number at REAL1 w}ill be computed and stored as a FP number at REAL2.EXP Syntax: EXP adr1,adr2 Purpose: To compute the inverse natur}al logarithm of a floating point number.Parameters: adr1 - address of the FP number whose natural } log will be computed adr2 - address at which the result will be stored Example: EXP NUMBER,INVLOGThe in}verse natural log of the FP number at address NUMBER is calculated and the result is stored starting at address INVLOG.EXP}10 Syntax: EXP10 adr1,adr2 Purpose: To calculate the inverse base 10 log of a floating point number.Para}meters: adr1 - address of the FP number whose inverse base 10 log will be computed. adr2 - add}ress at which to store the result Example: EXP10 TIME,VELOCITYThis macro calculates the inverse base 10 log of the FP nu}mber at TIME and stores the result at VELOCITY.EXPON Syntax: EXPON adr1,adr2,adr3 Purpose: To raise a FP number to} a power.Parameters: adr1 - address of the FP base adr2 - address of the FP exponent adr3 - address }at which the FP result is stored. Example: EXPON BASE,EXPONENT,RESULTThis example calculates the value of BASE raised to} the power EXPONENT and stores the floating point result in RESULT. This is the BASIC equivalent of RESULT = BASE^EXPONENT.}SQR Syntax: SQR adr1,adr2 Purpose: TO calculate the square root of a FP number.Parameters: adr1 - The address of a} FP number adr2 - The address at which to store the result of the square root calulation Ex}ample: SQR PRESSURE,ROOTThis macro determines the square root of the number at PRESSURE and stores the result at ROOT.I}FP Syntax: IFP int,adr Purpose: To convert a 2 byte integer to a 6 byte FP number.Parameters: int - the address of t}he 2 byte integer adr - the address of the 6 byte FP result Example: IFP COUNT,REALThe two byte integer at C}OUNT will be converted to a six byte FP number at REAL. The result can now be used in FP math calculations.FPI Synt}ax: FPI adr,int Purpose: To convert a 6 byte FP number to a 2 byte integer.Parameters: adr - address of the 6 byte FP num}ber int - address of the 2 byte integer result Example: FPI REAL,COUNTThis macro is the complement of IFP. }The FP number at REAL is converted into a two byte integer and stored at COUNT. The FP number is rounded up or down to the n}earest whole number.AFP Syntax: AFP string,adr Purpose: To convert an ASCII string of numeric characters. } to FP notation.Parameters: string - the address of the ASCII string adr - the address at which to store }the FP result Example: AFP BUFFER,SCOREHere, the ASCII string at BUFFER is converted to a FP number and stored at SCORE.} The only legal characters in the ASCII string are numeric digits (0-9), a decimal point (.), a plus or minus sign (+/-), an}d an "E" when using scientific notation.FASC Syntax: FASC adr1,adr2 Purpose: To convert a floating point number to} an ASCII string terminated by a carriage return.Parameters: adr1 - The address of the FP number adr}2 - The address at which to store the ASCII string. Example: FASC NUM,BUFFERThe macro converts the fl}oating point number stored at NUM to an ASCII string starting at adress BUFFER and terminating with a carriage return.FPM}OVE Syntax: FPMOVE adr1,adr2 Purpose: To move a six byte floating point number from one location to anoth}er.Parameters: adr1 - the source address adr2 - the destination address Example: FPMOVE SUBTOT,TOTALThis ma}cro call will move the six byte FP number at SUBTOT into the six bytes at TOTAL. This effectively replaces TOTAL with SUBTOT}. At the end of the macro call, the same FP number will be at SUBTOT and TOTAL.FPCOMP Syntax: FPCOMP adr1,adr2,adr}3 Purpose: To compare two floating point numbers and determine if they are equal or if the first is less tha}n the second or if the first is greater than the second.Parameters: adr1 - the address of the first FP number } adr2 - the address of the second FP number adr3 - the address of the byte at which to store } the result of the comparison Example: FPCOMP REAL1,REAL2,FLAGThe floating point number at REAL1 is compared to }the floating point number at REAL2 and the one byte result of the comparison is stored in FLAG as follows: 1 = REAL1 > }REAL2 0 = REAL1 = REAL2 255 = REAL1 < REAL2Notice that if REAL1 is greater than REAL2, the result stored in FLAG is} positive. If REAL1 is equal to REAL2, the result stored in FLAG is zero. If REAL1 is less than REAL2, the result stored in$}BIEQ Syntax: BIEQ adr1,adr2,adr Purpose: To test if two FP numbers are equal and branch to a given addres}s if the condition is true.Parameters: adr1 - The first FP number adr2 - The second FP number } adr3 - The address at which to branch if the two FP numbers are equal Example: BIEQ COUNT,MAX,EXIT}BIEQ stands for "Branch If Equal." In this case, if the FP number at COUNT is equal to the FP number at MAX, then the prog}ram will branch to EXIT. The assembly language equivalent of this is "JMP EXIT." Of course you do not have to use a label. } Specifying an absolute address such as $0600 in the macro call would be perfectly acceptable.BIGT Syntax: BIGT adr1},adr2,adr3 Purpose: To test if one FP number is greater than another and branch to a given address if the } condition is true.Parameters: adr1 - The first FP number adr2 - The second FP number adr3 - }The address at which to branch Example: BIGT REAL1,REAL2,GETNEXTBIGT stands for "Branch If Greater Than." In this case,} if the FP number at REAL1 is greater than the FP number at REAL2, the program will branch to the label GETNEXT (JMP GET}NEXT).BILT Syntax: adr1,adr2,adr3 Purpose: To test if one floating point number is less than another }and to branch to a given address if the condition is true.Parameters: adr1 - The address of the first FP number} adr2 - The address of the second FP number adr3 - The addres at which to branch Example: BILT SCOR}E,MIN,$0680If the FP number at SCORE is less than the FP number at MIN, the program will branch to address $0680 (JMP $0680}). Otherwise, the program will continue unaffected.PUTEL Syntax: PUTEL adr1,adr2,adr3 Purpose: To put a floating} point number into any element of an array of floating point numbers.Parameters: adr1 - Base address of the arra}y of FP numbers adr2 - This parameter is the memory address whose value holds the number (0-25}5) corresponding to the element in the FP array into which the FP number at adr3 } is to be placed adr3 - The address of the FP number which is to inserted into the} FP array Example: PUTEL ARRAY,ELEMENT,REALThis macro takes the FP number at REAL and inserts it into the ELEMENTth elem}ent of the FP array starting at address ARRAY. Note that the first ELEMENT is ELEMENT 0, the second is ELEMENT 1, etc. A fl}oating point array does not have to be specially declared or dimensioned. All you need to do is set aside enough room to hol}d your array. Each element of a floating point array consumes six bytes. If you only set aside sixty bytes for a floating p}oint array, you must be careful not to access any element outside the range of 0 through 9. The zeroth element of the array }is loacted at ARRAY. Element 1 is located at ARRAY+6, and element 2 is located at ARRAY+12, etc.Take note that this macro }reads the value in address ELEMENT to determine into which element of the FP array REAL will be placed. Suppose you wanted t}o put the FP number at REAL into the tenth element of the floating point array starting at ARRAY. First, you must set aside }66 bytes to hold the entire 11 element (0-10) array. This is accomplished in the following manner: ARRAY *=*+66This }line of assembly code defines the base address of the array as ARRAY and sets aside 66 bytes of memory to hold the array.To} put REAL in the tenth element of the array, there is a correct and incorrect method: Incorrect: PUTEL ARRAY,10,REAL } Correct: LDA #10 STA ELEMENT PUTEL ARRAY,ELEMENT,REALThe first macro call would yield} unpredicatable results, but the second will always place the FP number at REAL into the tenth element of the array. The BAS}IC equivalent of the above macro is: ARRAY(ELEMENT)=REALRefer to the demo programs for detailed examples of implement}ing floating point arrays.GETEL Syntax: GETEL adr1,adr2,adr3 Purpose: To retrieve any element from an array of fl}oating point numbers.Parameters: adr1 - The base address of the floating point array adr2 - The addr}ess of the memory location which holds the number (0-255) which corresponds to the numb}er of the element of the array which is to be extracted and placed in adr3 }adr3 - The address at which to place the FP number extracted from the array Example: GETEL ARRAY,ELEMEN}T,REALGETEL is the complement of PUTEL. This macro will take the ELEMENTth element of the FP array starting at address ARR}AY and place it at REAL. The same restictions that apply to PUTEL apply to GETEL. The BASIC equivalent of the above macro i}s: REAL=ARRAY(ELEMENT)You may notice the ease with which this macro can be placed in a loop. Each pass through the l}oop, the value in element may be incremented to, for example, print an entire array of floating point numbers.XXPUSH } Syntax: XXPUSH Purpose: To save the X, Y, and Accumulator registers on the stack before calling a macroParam}eters: None Example: XXPUSHThis macro is used internally by the Floating Point Library and need not be used by you when }implementing any floating point macros. XXPUSH and its complement, XXPULL, make sure that your X, Y, and Accumulator registe}rs are not altered by any the floating point macros. If you for any reason use this macro, make sure that you use XXPULL to }pull the X,Y, and A registers off the stack at the appropriate time, or else havoc will surely prevail. Use at your own risk}!!!XXPULL Syntax: XXPULL Purpose: To restore the previously saved X, Y, and Accumulator registers.Pa}rameters: None Example: XXPULLXXPULL is the complement of XXPUSH as explained above. You can see how XXPUSH and XXPULL} are used as the first and last lines of every macro definition in the Floating Point Macro Library.LIMITATIONS OF THE FP} LIBRARYRaising a negative number to a power by calling the EXPON macro is likely to yield unpredicatable results. This is} due to the fact that the calculation involves the use of logarithms, and negatives numbers do not have logarithms associated} with them. The Floating Point Library makes no attemp to catch such error. Your program will not crash if you try to do so}mething impossible, such as take the square root of a negative number, but the results will be unpredicatable.PROGRAMMING} TECHNIQUESA major criticism of the use of macros in assembly language is the fact that large macros tend to consume memory} ravenously if used heavily. The reason for this is that a macro is not like a subroutine or some type of function which pul}ls its parameters off a software stack. A macro is expanded, or reproduced, in its entirety each time it is called.A simpl}e solution to this problem is to implement heavily used macros as assembly language subroutines. The only disadvantage of th}is technique is that the parameters passed to the macro are fixed. For example, the following two lines of code are all that} is necessary to create a subroutine that prints a floating point number. PRINT PRINTFP REAL RTSThe routin}e can be called by the following instruction and consumes only three bytes each time it is called. JSR PRINTOf course}, you are limited in that the only floating point number this routine can print is the one at address REAL. But if you speci}fy real as target address at which to store the result of any FP calculation you intend to print, then everything is set up a}utomatically and a JSR to the PRINT subroutine is all that is necessary to print the result of your calculations. Although n}ot appropriate under all circumstances, this technique can save a considerable amount of memory when used efficiently.The }Demo ProgramIncluded on the diskette is a the source and object code for a demo of the Floating Point Library, FPDEMO.COM. } Tthe source code for the demo program is in two files, FPDEMO.M65 and MSG.M65. The RUN address for FPDEMO.COM is $5000 |The Trigonometric Libraryby Louis J. Chorich IIIOVERVIEWThe Trig Library accompanies the Floating Point Macro Library. } It contains an additional eight macros which implement the basic trigonometric functions sine, cosine, tangent, cotangent, s}ecant, and cosecant. Also included are macros for degree/radian conversions.The Trig Library is a stand alone library of m}acros and may be used independently of the Floating Point Library or in conjunction with it.All trig macros operate upon an}gles measured in radians. Specifying an angle in degrees will return incorrect results. All values must be in 6 byte Floati }ng Point format.The Trig Library is called TRIG.LIB and is included on the Library diskette. To access the trig macros, it } is necessary to INCLUDE the library file in your source code in the same way that FP.LIB is INCLUDEed. If both libraries ar }e needed, it is a good idea to INCLUDE them together at the begining of your assembly program. This is explained fully in th }e "Getting Started" section the Floting Point Package manual.Included on the diskette is a demo of the Trig Library, TRIGDE }MO.COM. The source code is TRIGDEMO.M65. The RUN address for TRIGDEMO.COM is $5000.THE TRIGOMOMETRIC MACROSSIN Syn}tax: SIN adr1,adr2 Purpose: To calculate the sine of an angle.Parameters: adr1 - address of a FP angle in radians } adr2 - address at which to store the FP result Example: SIN ANGLE,RESULTThis macro will calculate the sine of the a}ngle represented by the 6 byte floating point number at ANGLE and store the result of its calculation at RESULT.COS S}yntax: COS adr1,adr2 Purpose: To calculate the cosine of an angle.Parameters: adr1 - address of a FP angle in radians } adr2 - address at which to store the FP result Example: COS ANGLE,RESULTThe cosine of the floating point number} at ANGLE is evaluated and the reslt is stored at RESULT.TAN Syntax: TAN adr1,adr2 Purpose: To calculate the tang}ent of an angle.Parameters: adr1 - address of a FP angle in radians adr2 - address at which to store the FP resu}lt Example: TAN RADIANS,TANGENTThis macro will compute the tangent of the angle at RADIANS and store the floating point }result at TANGENT.COT Syntax: COT adr1,adr2 Purpose: To calculate the cotangent of an angle.Parameters: adr1 - ad}dress of a FP angle in radians adr2 - address at which to store the FP result Example: COT RADIANS,COTANThe} cotangent of the angle at RADIANS is evaluated and the floating point result is stored at COTAN.SCN Syntax: SCN adr1},adr2 Purpose: To calculate the secant of an angle.Parameters: adr1 - address of a FP angle in radians adr2 -} address at which to store the FP result Example: SCN THETA,SECANTThis macro call will calculate the secant of the radia}n angle at THETA and store the result at SECANT.CSC Syntax: CSC adr1,adr2 Purpose: To calculate the cosecant of an} angle.Parameters: adr1 - address of a FP angle in radians adr2 - address at which to store the result Exampl}e: CSC ALPHA,RESULTThis macro will calculate the cosecant of the radian angle at ALPHA and store te cosecant of ALPHA at RE}SULT.TORAD Syntax: TORAD adr1,adr2 Purpose: To convert a degree angle to radians.Parameters: adr1 - the address }of a FP angle in degrees adr2 - the address at which to store the FP angle in degrees Examp }le: TORAD DEGREES,RADIANSThis macro is used to convert the degree angle at DEGREES to a radian angle at RADIANS.TODEG !} Syntax: TODEG adr1,adr2 Purpose: To convert a radian angle to degrees.Parameters: adr1 - the address of a FP angle in "}radians adr2 - the address at which to store the FP angle in radians Example: TODEG RADIANS#},DEGREESThis macro is used to convert the radian angle at RADIANS to a degree angle at DEGREES.s Example: TODEG RADIANSb FLAG is negative (to the 6502, all numbers from 128 to 255 [$7F - $FF] are considered negative. This makes for easy testing%} of the result byte and branching accordingly.128 to 255 [$7F - $FF] are considered negative. This makes for easy testing1ng of the result byte and branching accordingly.128 to 255 [$7F - $FF] are considered negative. This makes for easy testi3trademarks of Optimized Systems Software, Inc.haser.Antic is a trademark of Antic Publishing, Inc.MAC/65 and DOS-XL are 0d in FLAG is negative (to the 6502, all numbers from 128 to 255 [$7F - $FF] are considered negative. This makes for easy tes)}ting of the result byte and branching accordingly.28 to 255 [$7F - $FF] are considered negative. This makes for easy tes6  LDFR0R& LOG100 FPMOVE CONST2=FR1: FDIVD EXP10N $> X %> b FST0Rl XXPULL v  X;+} X; FPMOVE XXPUSH $> FPMOVE1 2 Q 9 P 9 (> HFPMOVE1 XXPULL  X; X; FPCOMP ,} XXPUSH * FPSUB = =LBUFF4 QLBUFF> FFPCOMP3H GFPCOMP1R !FPCOMP2\ FPCOMP1f Q>p P z !FPCOMP4 FP-}COMP2 Q> P  !FPCOMP4 FPCOMP3 Q> P  FPCOMP4 XXPULL  X; X; INPUTFP  XXPUSH  GE.}TNUMAFP = $ XXPULL .8X;BX;L PRINTFP V XXPUSH `FASC =j$>t%>~Q> PRINTERR /}XXPULL X;X; BIEQ  XXPUSH FPCOMP = =LBUFF QLBUFF FBIEQ1 HBIEQ2 BIEQ1 XXPU0}LL !  BIEQ2 XXPULL (2X;<X;F BIGT P XXPUSH ZFPCOMP = =LBUFFd QLBUFFnR>x FBIGT1}1 HBIGT2 BIGT1 XXPULL !  BIGT2 XXPULL X;X; BILT  XXPUSH FPCOMP = =LBUFF2} QLBUFFR> FBILT1 HBILT2" BILT1, XXPULL 6! @ BILT2J XXPULL T^X;hX;r EXPON | XXPUSH3}  $>  %> Q>PCIX LDFR0R LOGFPMOVE =FR1 FMUL EXP $>  %> Q>4}PCIX FST0R XXPULL &X;0X;: EXP D XXPUSH N $> X %> b LDFR0Rl EXPv $>  %> 5} FST0R XXPULL X;X; EXP10  XXPUSH  $>  %>  LDFR0R EXP10 $>  %> 6}  FST0R XXPULL *X;4X;>X;HX;R XXPUSH \5fCp5zA5X;X; XXPULL 7>77}?7X;X; GETNUMQ> PICBLL$Q>. PICBLH8Q>B PICBALLQ>V PICBAH`Q>j PICCOMt$>~ 8}CIOV:X;X; GETNUMQ> PICBLL$Q>. PICBLH8Q>B PICBALLQ>V PICBAH`Q>j PICCOMt$>~ (d"X; FLOATING POINT MACRO LIBRARYnX;xX; Copyright (c) 1986 X; by: Louis J. Chorich IIIX;$X; From ANTIC, The:} Atari Resource"X; FILE ----> FPANNOT.LIBX;X;AFP;;ASCII TO FPFASC;;FP TO ASCIIIFP;;INTE;}GER TO FPFPI;;FP TO INTEGERFSUB`;;FP SUBTRACTIONFADDf;;FP ADDITIONFMUL;;FP MULTIPLICATIONFD<}IV(;;FP DIVISION/LDFR0R;;LOAD FR0 USING X & Y AS POINTER9LDFR0P;;LOAD FR0 USING FLPTR & FLPTR+1 AS POINTER"=}/LDFR1R;;LOAD FR1 USING X & Y AS POINTER,9LDFR1P;;LOAD FR1 USING FLPTR & FLPTR+1 AS POINTER6.FST0R;;STORE FR>}0 USING X& Y AS POINTER@9FST0P;;STORE FR0 USING FLPTR & FLPTR+1 AS POINTERJFMOVE;;MOVE FR0 TO FR1T&EXP;;IN?}VERSE NATURAL LOG - e^X^)EXP10;;INVERSE BASE 10 LOG - 10^XhLOG;;NATURAL LOGrLOG10;;BASE 10 LOG|ZFR0D@};;ZERO OUT FR0FR0;;$D4-$D9 = FR0FR1;;$E0-$E5 = FR13FLPTR;;ALL PURPOSE POINTER FOR FP OPERATIONSINBUFA}F;;INPUT BUFFER CIX;;COUNTER INDEX OFFSET ICCOMB;;IOCB COMMAND BYTE%ICBALD;;IOCB BUFFER ADDRESS LO%ICB}BAHE;;IOCB BUFFER ADDRESS HI$ICBLLH;;IOCB BUFFER LENGTH LO$ICBLHI;;IOCB BUFFER LENGTH HI CIOVV;;CENTRAL C}I/O VECTOR8LBUFF;;LINE BUFFER (USED AS WORKSPACE FOR FP LIBX;X;,CONST22 ;FP CONSTANT WITH VALUE OF TWOX;D}&FPADD ;;ADD 2 FP NUMBERS0"XXPUSH ;;SAVE X,Y,A REGISTERS:)$> ;;GET THE ADDRESS OF THE FIRSTD#%> ;;FLOATINE}G POINT NUMBERN! LDFR0R;;AND LOAD IT INTO FR0X)$> ;;NOW PUT THE SECOND FP NUMBERb%> ;;l LDFR1R;;INTO FR1vF} FADD;;AND ADD THEM*$> ;;POINT TO THE ADDRESS AT WHICH5%> ;;TO PLACE THE RESULT WHICH IS NOW IN FR0 FST0G}R;;AND STORE IT.%XXPULL ;;RESTORE X,Y,A REGISTERS ;;DONE.X;X;"FPSUB ;;SUBTRACT 2 FP NUMBERS%XXPUSH ;;SAVH}E REGISTERS ON STACK%$> ;;LOAD THE FIRST FP NUMBER%> ;; LDFR0R;;INTO FR0&$> ;;LOAD THE SECOND FP NI}UMBER%> ;;  LDFR1R;;INTO FR1 FSUB;;AND SUBTRACT THEM !$> ;;POINT TO THE ADDRESS*%> ;;AT WHICH TJ}O STORE4 FST0R;;AND STORE IT THERE>XXPULL ;;RESTORE REGISTERSH;;RX;\X;f"FPMUL ;;MULTIPLY 2 FP NUMBERSpXXK}PUSH ;;SAVE X,Y,Az$> ;;LOAD THE FIRST%> ;;FP NUMBER LDFR0R;;INTO FR0$> ;;LOAD THE SECOND%> L};;FP NUMBER LDFR1R;;INTO FR1 FMUL;;AND MULTIPLY THEM $> ;;%> ;; FST0R;;STORE THE RESULTXXM}PULL ;;RESTORE X,Y,A;;X;X; FPDIV ;;DIVIDE 2 FP NUMBERSXXPUSH ;;SAVE X,Y,A$> ;;LOAD THE FIRST$%> N};;FP NUMBER. LDFR0R;;INTO FR08$> ;;AND THE SECONDB%> ;;FP NUMBERL LDFR1R;;INTO FR1V FDIV;;FR0/FO}R1` $> ;;j%> ;;t FST0R;;STORE THE RESULT~XXPULL ;;RESTORE X,Y,A;;X;X;%AFP ;;CONVERT ASCII P}STRING TO FPXXPUSH ;;SAVE X,Y,AQ> ;;INBUFF POINTS TOPINBUFF;;ASCII STRINGQ> ;;PINBUFFQ>Q};;OFFSET ISPCIX;;SET TO ZERO AFP;;DO THE CONVERSION$> ;;SET THE POINTERS *%> ;;TO THE ADR IN THE MACROR} CALL FST0R;;AND STORE THE NUMBERXXPULL ;;RESTORE X,Y,A(;;2X;<X;FFASC ;;CONVERT FP TO ASCIIPXXPUSH ;;S}SAVE X,Y,AZ$> ;;POINT TO FP NUMBERd%> ;;n LDFR0R;;AND LOAD INTO FR0x FASC;;PERFORM CONVERSION,$> T};;SET POINTERS TO BUFFER AT WHICH'%> ;;TO STORE THE ASCII STRING FASC;;AND DO IT %>;;&FASC1;PUT A CARRIAGU}E RETURN AFTER3;;THE STRINGQ 8;;GET EACH BYTE,IFASC1;;IS THIS THE LAST CHARACTER? NO.M>;;YES, CLEAR MSBP V}8;;AND STORE IT3;;Q>;;END THE STRINGP 8;;WITH A CRXXPULL ;;RESTORE X,Y,A;;X;"X;,+PRINTERR;SUBW}ROUTINE TO PRINT TO SCREEN6%PICBLL;;PUT ACCUMULATOR INTO IOCB@Q>;;BUFFER LENGTH LOJPICBLH;;ZERO THE HI BYTETA;;PUTX} X INTO^PICBAL;;BUFFER ADDRESS LOhC;;AND Y INTOrPICBAH;;BUFFER ADDRESS HI|Q> ;;CODE FORPICCOM;;PUT RECORD$>Y};;USE IOCB #0 - EDITOR CIOV;;AND PRINT THE STRING :;;RETURNX;X;)FPI ;;CONVERT FP TO TWO BYTE INTEGERXXZ}PUSH ;;SAVE X,Y,A$> ;;SET POINTER%> ;;$ LDFR0R;;LOAD FP NUMBER INTO FR0 FPI;;CONVERT TO INTEGERQF[}R0;;AND STORE THEP ;;TWO BYTE INTEGER%QFR0;;AT THE ADDRESS SPECIFIEDP ;;IN THE MACRO CALL&XXPULL ;;RES\}TORE X,Y,A0;;:X;DX;N'IFP ;;CONVERT 2 BYTE INTEGER TO FPXXXPUSH ;;SAVE X,Y,AbQ ;;PUT INTEGERlPFR0;;INTO F]}R0vQ ;;ANDPFR0;;FR1 IFP;;PERFORM THE CONVERSION$> ;;POINT TO THE!%> ;;DESTINATION ADDRESS^} FST0R;;AND STORE THE RESULTXXPULL ;;RESTORE X,Y,A;;X;X;LN ;;NATURAL LOGARITHMXXPUSH ;;SAVE X,Y,A_}$> ;;POINT TO THE%> ;;FP NUMBER LDFR0R;;AND LOAD INTO FR0  LOG;;COMPUTE NATURAL LOG-$> ;;POINT `}TO THE DESTINATION ADDRESS %> ;;* FST0R;;AND STORE THE RESULT4XXPULL ;;RESTORE X,Y,A>;;HX;RX;\$LOG ;a};COMPUTE BASE 10 LOGARITHMfXXPUSH ;;SAVE X,Y,Ap$> ;;POINT TO THEz%> ;;FP NUMBER LDFR0R;;AND LOAD ITb} LOG10;;COMPUTE BASE 10 LOG-$> ;;POINT TO THE DESTINATION ADDRESS%> ;; FST0R;;AND STORE THE RESULTXc}XPULL ;;RESTORE X,Y,AX;X;"GETEL ;;GET AN ELEMENT OUT OF$XXPUSH ;;AN ARRAY OF FP NUMBERSQ ;;%2 = THE ELd}EMENT TOP;;BE RETRIEVED Q> ;;MAKE $B0 POINT P;;TO THE BASE Q> ;;ADDRESS OF THE$ P;;FP ARRAY. %;e};TARGET ELEMENT8 )>;;IS IT THE FIRST ONEB FGETEL4;;YES, GET ITL 1;;NOV GETEL1;COMPUTE ITS ADDRESS` 1;;BY MULTIPLYINf}G Yj ,;;BY 6t Q;;AND ADJUST $B0~ O>;;TO POINT P;;TO THE EGETEL3;;TARGET ELEMENT GETEL2 )>;;DONE YET? g}HGETEL1;;NO $!GETEL4;;YES, GET TARGET ELEMENT GETEL3;IF $B0 OVERFLOWS, #;;INCREMENT $B1 !GETEL2;; GETEL4 q}B%DOS SYSB-)AUTORUN SYSB VFONT SETB_DOC 000B_dDOC 001BCDOC 002B DOC 003BTRIG LIBBFPDEMO M65BMSG M65BTRIGDEMOM65B#FPDEMO COMB TRIGDEMOCOMB ;CHAR23 MAPBDSEQ1 PGMBFSEQ2 PGMBHANTIC PGMBNSHIP PGMBQMENU PGMBVTITLE PGMB\SELECT1 PGMB^SELECT2 PGMBbAUTHOR PGMBfRAYGUN SNDBgCASTLE1 SCRBvTURRETA SCRBwTURRETADSCRBxTURRETB SCRByTURRETBDSCRBzTURRETC SCRB{TURRETCDSCRB|CLEAR SCRBFLASH SCR/]5BPgĀĀgĀ g `!!&g"."##x$ $&%%_ '^'(Ug&U)̀(%>;; GETEL5;TRANSFER TARGET 3;;ELEMENT INTO Q@7;;DESTINATION ADDRESS P 8;; )>;;( HGETEL5;;2 XXPULL ;r};RESTORE X,Y,A< F X;P X;Z +PUTEL ;;PUT AN ELEMENT INTO A FP ARRAYd XXPUSH ;;SAVE X,Y,An Q ;;%2 = TARGET ELEMENTx s}P;;STORE IT IN $B2 Q> ;;MAKE $B0 POINT TO P;;THE BASE ADDRESS Q> ;;OF THE FP ARRAY P;; !%;;GET Tt}ARGET ELEMENT NUMBER )>;;IS IT THE FIRST FPUTEL4;;YES, GET IT 1;;NO, ADJUST $B0 !PUTEL1;BY MULTIPLYING Y BY 6 1u};;AND ADDING TO Z$B0 & $B1 ,;;SO THAT THEY POINT Q;;TO THE TARGET ELEMENT O>;; P;; EPUTEL3;; PUTEL2" )>v};;DONE YET?, !HPUTEL1;;NO, CONTINUE LOOPING6 !PUTEL4;;YES, GET ELEMENT@ PUTEL3;IF $B0 OVERFLOWS,J #;;INCREMENT $B1w}T !PUTEL2;;^ PUTEL4h %>;;r PUTEL5;PUT FP NUMBER| 3;;INTO THE TARGET Q 8;;ELEMENT OF THE P@7;;ARRAY )>x};; HPUTEL5;; XXPULL ;;RESTORE X,Y,A ;; X; X; SQR ;;SQUARE ROOT XXPUSH ;;SAVE X,Y,A $> ;;POINT TOy} THE %> ;;FP NUMBER ! LDFR0R;;AND LOAD IT INTO FR0  LOG;;TAKE THE LOG (FPMOVE CONST2=FR1;;PUT 2 INTO FR1 z} FDIV;;AND DIVIDE FR0/FR1&  EXP;;TAKE THE INVERSE LOG0 $> ;;SET POINTERS: %> ;;D  FST0R;;AND STORE RESULTN {}XXPULL ;;RESTORE X,Y,AX ;;b X;l X;v FPMOVE ;;MOVE A FP NUMBER XXPUSH ;;SAVE X,Y,A $>;; "FPMOVE1;6 BYTES |}WILL BE MOVED 2;; Q 9;;SOURCE P 9;;DESTINATION (>;;DONE YET? HFPMOVE1;;NO XXPULL ;;YES, RESTORE X,Y,A }};; X; X; "FPCOMP ;;COMPARE 2 FP NUMBERS XXPUSH ;;SAVE X,Y,A 0FPSUB = =LBUFF;;SUBTRACT 2ND FROM 1ST QL~}BUFF;;GET EXPONENT FFPCOMP3;;IF ZERO, %1=%2* "GFPCOMP1;;IF MSB IS SET, %1<%24 !FPCOMP2;;ELSE %1>%2> FPCOMP1H Q>;;}RETURN -1R P ;;\ !FPCOMP4;;f FPCOMP2;%1 < %2p Q>;;RETURN 1z P ;; !FPCOMP4;; FPCOMP3;%1 = %2 Q>;;RETU}RN 0 P ;; FPCOMP4 XXPULL ;;RESTORE X,Y,A ;; X; X; INPUTFP ;;INPUT A FP NUMBER XXPUSH ;;SAVE X,Y,A} / GETNUM;;GET THE ASCII STRING FROM KEYBOARD AFP = ;;CONVERT TO FPXXPULL ;;RESTORE X,Y,A;;X;$X;. }PRINTFP ;;PRINT A FP NUMBER8XXPUSH ;;SAVE X,Y,AB&FASC =;;CONVERT FP TO ASCIIL$>;;ICBALV%>;;ICBAH`Q>;};ICBLLj PRINTERR;;PRINT ITtXXPULL ;;RESTORE X,Y,A~;;X;X;BIEQ ;;BRANCH IF %1 = %2XXPUSH ;;SAVE X,Y,A}4FPCOMP = =LBUFF;;PERFORM FP COMPARISONQLBUFF;;ARE THEY EQUALHBIEQ2;;NOBIEQ1;YESXXPULL ;;RE}STORE X,Y,A! ;;AND BRANCH BIEQ2XXPULL ;;RESTORE X,Y,A;;DON'T BRANCH X;X;BIGT ;;BRANCH IF %1 > %2(}XXPUSH ;;SAVE X,Y,A24FPCOMP = =LBUFF;;PERFORM FP COMPARISON<QLBUFF;;FR>;;IS %1 > %2PHBIGT2;;NOZ}BIGT1;YESdXXPULL ;;RESTORE X,Y,An! ;;AND BRANCHxBIGT2;ELSEXXPULL ;;RESTORE X,Y,A;;DON'T BRANCHX;}X;BILT ;;BRANCH IF %1 < %2XXPUSH ;;SAVE X,Y,A4FPCOMP = =LBUFF;;PERFORM FP COMPARISONQLBUFF;;}R>;;IS %1 < %2HBILT2;;NOBILT1;YESXXPULL ;;RESTORE X,Y,A! ;;AND BRANCHBILT2;ELSEXXPULL ;;RESTO}RE X,Y,A;;DON'T BRANCH"X;,X;6#EXPON ;;EXPONENTIATION - %1^%2@XXPUSH ;;SAVE X,Y,AJ$> ;;POINT TO THE BASE}T%> ;;^! LDFR0R;;AND LOAD IT INTO FR0h" LOG;;TAKE THE LOG OF THE BASEr)FPMOVE =FR1;;PUT EXPONENT IN FR1|+} FMUL;;MULTIPLY LOG OF BASE BY EXPONENT EXP;;TAKE INVERSE LOG)$> ;;POINT TO DESTINATION ADDRESS%> ;; }FST0R;;AND STORE RESULTXXPULL ;;RESTORE X,Y,A;;X;X;$EXP ;;INVERSE NATURAL LOG - e^XXXPUSH ;;SAVE X,Y},A$> ;;POINT TO THE%> ;;FP NUMBER LDFR0R;;AND LOAD INTO FR0" EXP;;TAKE INVERSE NATURAL LOG)$> };;POINT TO DESTINATION ADDRESS%> ;;& FST0R;;AND STORE RESULT0XXPULL ;;RESTORE X,Y,A:;;DX;NX;X EXP10} ;;INVERSE BASE 10 LOGbXXPUSH ;;SAVE X,Y,Al$> ;;POINT TO THEv%> ;;FP NUMBER! LDFR0R;;AND LOAD IT INTO F}R0' EXP10;;COMPUTE INVERSE BASE 10 LOG)$> ;;POINT TO DESTINATION ADDRESS%> ;; FST0R;;AND STORE RESULT}XXPULL ;;RESTORE X,Y,A;;X;X;!XXPUSH ;;SAVE X,Y,A ON STACK5C5A 5 X;*X;4"XXPULL ;;PU}LL X,Y,A OFF STACK>7H>R7\?f7pzX;X;/GETNUM;SUBROUTINE TO GET INPUT FROM EDITORQ>;;BUFFER LENGTH LO} PICBLL;; Q>;; PICBLH;;&Q>;;BUFFER ADDRESS = LBUFF $0580 PICBAL;; Q>;; PICBAH;;Q>;;CODE FOR GET }RECORD PICCOM;;$>;;USE IOCB #0 - EDITOR CIOV;;GET INPUT :;;RETURNL;; Q>;; PICBAH;;Q>;;CODE FOR GET O d!X; TRIGONOMETRIC MACRO LIBRARYnX;xX; FILE ----> TRIG.LIBX;X; Copyright (c) 1986 X; by: Louis J. Choric!}h IIIX;$X; From ANTIC, The Atari ResourceX;X; @DIFF0 @INC0@APPROX0 @TEMP0 @TEMP10 @TE!}MP20 @TEMP30 @TEMP40@RADIANS0"@CONST00,@CONST116@CONST22@@CONSTM1-1J@PI3.141592654!}T@PID21.570796327^@PD18057.29577951h @FLAG r 10FADD| FSUB`چ FADDfڐ FMULښ FDIV(ۤLDFR0!}RݮLDFR1Rݸ FST0R FMOVE FR0 FR1X;X; @FPLSINQ> P@FLAG$>@RADIANS&!}%>@RADIANS0 LDFR0R:$>@APPROXD%>@APPROXN FST0RX$>@DIFFb%>@DIFFl FST0Rv$>@CONST1!}%>@CONST1 LDFR0R $>@INC%>@INC FST0R @FPLSIN1$>@RADIANS%>@RADIANS LDFR0R!}$>@RADIANS%>@RADIANS LDFR1R FMUL FMOVE $>@CONST0%>@CONST0  LDFR0R* FSUB4$>@D!}IFF>%>@DIFFH LDFR1RR FMUL\$>@TEMPf%>@TEMPp FST0Rz $>@INC%>@INC LDFR0R$>@!}CONST2%>@CONST2 LDFR1R FMUL$>@TEMP1%>@TEMP1 FST0R$>@CONST1%>@CONST1 !}LDFR1R FADD$>@TEMP1%>@TEMP1 LDFR1R$ FMUL. FMOVE8$>@TEMPB%>@TEMP1L%>@TEMPV !}LDFR0R` FDIVj$>@DIFFt%>@DIFF~ FST0R$>@APPROX%>@APPROX LDFR1R FADD$>@APPROX!}%>@APPROX FST0R $>@INC%>@INC LDFR0R$>@CONST1%>@CONST1 LDFR1R  FADD $>@I!}NC%>@INC( FST0R2 Q@FLAG<R> FH@F3P:Z@F3d #@FLAGn !@FPLSIN1xX;X; SIN  $>  %> !} LDFR0R$>@RADIANS%>@RADIANS FST0R @FPLSIN$>@APPROX%>@APPROX LDFR0R $> !} %>  FST0R"X;,X;6 COS @ $>@PIJ %>@PIT LDFR0R^$>@CONST2h%>@CONST2r LDF!}R1R| FDIV $>  %>  LDFR1R FSUB$>@TEMP%>@TEMP FST0RSIN @TEMP= X;!}X; TAN SIN =@TEMP4$>@PID2%>@PID2 LDFR0R& $> 0 %> : LDFR1RD FSUBN$>@RADI!}ANSX%>@RADIANSb FST0Rl @FPLSINv$>@APPROX%>@APPROX LDFR1R$>@TEMP4%>@TEMP4 !}LDFR0R FDIV $>  %>  FST0RX;X; COT TAN =FR1 $>@CONST1%>@CONST1  !} LDFR0R* FDIV4 $> > %> H FST0RR\X;fX;p SCN zCOS =FR1$>@CONST1%>@CONST1!} LDFR0R FDIV $>  %>  FST0RX;X; CSC SIN =FR1$>@CONST1 %>@CONST1!} LDFR0R FDIV$ $> . %> 8 FST0RB L X;V X;` TORAD j $>@PD180t %>@PD180~ LDFR1R $> !} %>  LDFR0R FDIV $>  %>  FST0R  X; X; TODEG $>@PD180 %>@PD180!} LDFR1R $>  %> ( LDFR0R2 FMUL< $> F %> P FST0RZ EG $>@PD180 %>@PD180 \6 dX;FP MACRO LIBRARY DEMOnX;xX;COPYRIGHT (C) 1986X; By: Louis J. Chorich IIIX;#X;From ANTIC, The Atari Reso%}urceX;X;P !BEGINX;>D:MSG.M65>D:FP.LIBX;X; REAL10 REAL20 REAL30 REAL40"%} RESULT0,RESULT106RESULT20@RESULT30JRESULT40TBUFF1 ^BUFF2 hCOUNTERMSG18 r EL %}|X;X;X;START OF THE PROGRAMX; BEGIN $>MSG1%>MSG1 PRINT $>MSG2%>MSG2 PRINT%} $>MSG3%>MSG3 PRINT$>MSG33%>MSG33 PRINT&$>MSG340%>MSG34: PRINTD$>MSG33%}N%>MSG33X PRINTb$>MSG35l%>MSG35v PRINT$>MSG33%>MSG33 PRINT $>MSG6%>M%}SG6 PRINT CR CR$>INTROMSG%>INTROMSG PRINT CR$>INTROMSG1%>INTROMSG1  %}PRINT$>INTROMSG2 %>INTROMSG2* PRINT4 START> $>MSG5H%>MSG5R PRINT\ CRf CRp$>INPUTA%}z%>INPUTA PRINTINPUTFP REAL1 CR$>INPUTB%>INPUTB PRINTINPUTFP REAL2 CR!%}FPDIV REAL1=REAL2=RESULT4!FPSUB REAL1=REAL2=RESULT2!FPMUL REAL1=REAL2=RESULT3!FPADD REAL1=REAL2=RES%}ULT1$>ADDMSG%>ADDMSGQ> PRINTLEN$PRINTFP RESULT1.$>SUBMSG8%>SUBMSGBQ>L PRINTL%}ENVPRINTFP RESULT2`$>MULMSGj%>MULMSGtQ>~ PRINTLENPRINTFP RESULT3$>DIVMSG%>DIVMSG%}Q> PRINTLENPRINTFP RESULT4 START$>LOGMSG%>LOGMSGQ>; PRINTLENLN REAL1=RESULT%}1PRINTFP RESULT1 $>LOG10MSG%>LOG10MSGQ>( PRINTLEN2LOG REAL1=RESULT<PRINTFP RESULTF %}CRP CRZ$>INVLOGMSGd%>INVLOGMSGnQ>x PRINTLENEXP REAL2=RESULTPRINTFP RESULT$>INVLOG10MS%}G%>INVLOG10MSGQ> PRINTLENEXP10 REAL2=RESULTPRINTFP RESULT CR CR$>EXPOMSG%>%}EXPOMSGQ> PRINTLEN EXPON REAL1=REAL2=RESULTPRINTFP RESULT" CR,$>SQRMSG6%>SQRMSG@%}Q>J PRINTLENTSQR REAL1=RESULT2^PRINTFP RESULT2h STARTr $>MSG8|%>MSG8 PRINT CR $>MSG%}9%>MSG9Q> PRINTLENPRINTFP REAL1$>MSG10%>MSG10Q> PRINTLENPRINTFP REAL2%} CR CRBIEQ REAL1=REAL2=EQUALBIGT REAL1=REAL2=GREAT&BILT REAL1=REAL2=LESS0 EQUAL:$>EQUALMS%}GD%>EQUALMSGN PRINTX !ARRAYSb GREATl$>GREATERMSGv%>GREATERMSG PRINT !ARRAYSLESS$>%}LESSMSG%>LESSMSG PRINT ARRAYS START$>MSG11%>MSG11 PRINT CRQ>0 PCOUNTER %}Q>PEL  PRINTLOOP* #COUNTER4#EL>GETEL BASEADR=EL=REAL4H$>MSG18R%>MSG18\Q> f PRINTLENp%}PRINTFP REAL4zQELR>  FARRAYS2!PRINTLOOP ARRAYS2Q>PELPUTEL BASEADR=EL=REAL1Q> PE%}LPUTEL BASEADR=EL=REAL2 CR$>MSG12%>MSG12 PRINT $>MSG13 %>MSG13$ PRINT. STAR%}T8 $>MSG14B %>MSG14L PRINTV  CR` Q>0j PCOUNTERt Q>~ PEL PRINTLOOP1 #COUNTER #EL GETEL %}BASEADR=EL=REAL3 $>MSG18 %>MSG18 Q> PRINTLEN PRINTFP REAL3 QEL R> FDONE !PRINTLOOP1 %} DONE :=REAL3 $>MSG18 %>MSG18 Q> PRINTLEN PRINTFP REAL3 QEL R> FDONE !PRINTLOOP1 $ ; dX; FILE ----> MSG.M65nX;xX;"X; SUBROUTINES AND MESSAGES FORX; USE BY FPDEMO.M65X;X; Copyright (c)1986 b)}y:X; Louis J. Chorich IIIX;$X; From ANTIC, The Atari ResourceX;X;&X;SUBROUTINE TO OUTPUT CR TO EDITORC)}R$>CRMSG%>CRMSG PRINT:X;"X;,$X;SUBROUTINE TO PRINT A STRING TO6!X;THE SCREEN. X REG HOLDS THE@)}#X;LOW BYTE OF THE STRING ADDRESSJ"X;Y REG HOLDS HI BYTE OF STRINGT X;ADDRESS^X;h PRINTr &ICBAL| 'ICBAHQ>  P)}ICCOMQ> PICBLL PICBLH$> CIOV:X;X;#X;SUBROUTINE TO WAIT UNTIL STARTX;KEY IS PRESSED AND THEN)} X;CONTINUEX; START CR& CR0 $>MSG4:%>MSG4D PRINTN START1XQbR>l HSTART1v:X;)}X;$X;SUBROUTINE TO PRINT A STRING OF X;THE LENGTH INDICATED BY THE X;CONTENTS OF THE ACCUMULATOR*X;X REG HOLDS LO BYT)}E OF STRING ADDRESS*X;Y REG HOLDS HI BYTE OF STRING ADDRESSX; PRINTLEN PICBLLQ> PICBLH &ICBAL 'ICBAH)} Q>  PICCOM $>* CIOV4:>X;HX;RADDMSG AA + B = A=\SUBMSG AA - B = A=fMULMSG AA * B = A=p)}DIVMSG AA / B = A=z6LOGMSG }=AӠŠԠΠA ==ANATURAL LOG OF A = A#LOG10MSG ABA)}SE 10 LOG OF A = A$SQRMSG ASQUARE ROOT OF A = A=EXPOMSG AA^B = A=4MSG1 }=A *******************************)}*A=2MSG2 A * FLOATING POINT MACRO LIBRARY *A=3MSG33 A * *A=3MSG34 A * b)}y: Louis J. Chorich III *A=3MSG35 A * From ANTIC, The Atari Resource *A=2MSG3 A * DEMONSTRATION )} *A=)MSG4 APRESS START TO CONTINUE...A=-MSG5 }=ABASIC ARITHMETIC OPERATIONSA=1MSG6 A ******************)}**************A=#INPUTA AENTER FP NUMBER A:A=#INPUTB AENTER FP NUMBER B:A=gINTROMSG AThis program demonstra)}tes the use of the macros contained in the FP Macro Library.A=$]INTROMSG1 AIt is divided into sections which demon)}strate the various capabilitesA=.#INTROMSG2 Aof the Library.A=8 CRMSG B*INVLOGMSG AINVERSE NATURAL LOG OF B=AL)},INVLOG10MSG AINVERSE BASE 10 LOG OF B=AVEXPONMSG AA^B =A`(GREATERMSG AA IS GREATER THAN BA=j"LESSMSG AA IS LES)}S THAN BA=t"EQUALMSG AA IS EQUAL TO BA=~KMSG7 AUSING THE BIEQ, BIGT, AND BILT MACROS,I HAVE DETERMINED THATA=.)}MSG8 }=ATHE NUMBERS YOU ENTERED ARE:A=MSG9 AA = AMSG10 AB = A5MSG11 }=AHere is an array of 10 FP numbers.A)}=XMSG12 AWhen you press START, I'll take the two numbers (A & B) you previouslyA=ZMSG13 Aentered and insert the)}m into elements 3 and 9 of the floating point array.A=(MSG14 }=AHere's the new array:A=TMSG15 ADo you see the nu)}mbers you entered at elements 3 and 9 of the array?A=YMSG16 AIf you examine the FPDEMO.M65 source code, you'll notice )}that only one callAaMSG17 Ato the PRINTFP macro is necessary to print all ten numbers. It is put in aloop.A=MSG18)} AElement #1: A BASEADR13  56.34-43.3333333( 0.452 0.25< 5432.84F 3.14156P6.02205E23Z )}5.91E-12 #1: A BASEADR13  56.34-43.3333333( 0.452 0.25< 5432.84F 3.14156P6.02205E23Z ( dX;TRIG MACRO LIBRARY DEMOnX;xX;COPYRIGHT (C) 1986X; By: Louis J. Chorich IIIX;$X; From ANTIC, The Atari R-}esourceX;P !BEGINX;>D:TRIG.LIB>D:FP.LIBX;X; REAL0 REAL10 RESULT0#MSG2 AENTE-}R AN ANGLE (0-360) A!MSG3 }=ATHE SINE IS A"MSG4 ATHE COSINE IS A,MSG5 ATHE TANGENT IS A6MSG6 ATHE-} COTANGENT IS A@MSG7 ATHE SECANT IS AJMSG8 ATHE COSECANT IS AT$MSG9 ATHE ANGLE IN DEGREES IS A^%MSG10 ATHE -}ANGLE IN RADIANS IS Ah#MSG11 APRESS START FOR DOSA=r6MSG12 }=A ********************************A=|4MSG13 A *-} *A=4MSG14 A * TRIG MACRO LIBRAY *A=4MSG15 A * by: Louis J. Chor-}ich III *A=4MSG16 A * From ANTIC, The Atari Resource *A=3MSG17 A ********************************A=X;-}X;X;START OF THE PROGRAMX; BEGIN$>MSG12%>MSG12 PRINT$>MSG13%>MSG13 PRINT$-}>MSG14&%>MSG140 PRINT:$>MSG13D%>MSG13N PRINTX$>MSG15b%>MSG15l PRINTv$>MSG13-}%>MSG13 PRINT$>MSG16%>MSG16 PRINT$>MSG13%>MSG13 PRINT$>MSG17%>-}MSG17 PRINT CR CR CR  $>MSG2%>MSG2 Q>* PRINTLEN4INPUTFP REAL1>TORAD REAL1=-}REALH CRR CR\ $>MSG3f%>MSG3pQ>z PRINTLENSIN REAL=RESULTPRINTFP RESULT $>MSG4%>-}MSG4Q> PRINTLENCOS REAL=RESULTPRINTFP RESULT $>MSG5%>MSG5Q> PRINTLENTA-}N REAL=RESULTPRINTFP RESULT $>MSG6%>MSG6$Q>. PRINTLEN8COT REAL=RESULTBPRINTFP RESULTL-} $>MSG7V%>MSG7`Q>j PRINTLENtSCN REAL=RESULT~PRINTFP RESULT $>MSG8%>MSG8Q> -} PRINTLENCSC REAL=RESULTPRINTFP RESULT CR CR $>MSG9%>MSG9Q> PRINTLENPRINTFP-} REAL1  CR$>MSG10%>MSG10(Q>2 PRINTLEN<PRINTFP REALF CRP CRZ STARTd:nX;xX; CR-}MSG X;&X;SUBROUTINE TO OUTPUT CR TO EDITORCR$>CRMSG%>CRMSG PRINT:X;X;$X;SUBROUTINE T-}O PRINT A STRING TO!X;THE SCREEN. X REG HOLDS THE#X;LOW BYTE OF THE STRING ADDRESS"X;Y REG HOLDS HI BYTE OF STRING X-};ADDRESSX;" PRINT, &ICBAL6 'ICBAH@Q> J PICCOMTQ>^ PICBLLh PICBLHr$>| CIOV:X;X;#X;SUBR-}OUTINE TO WAIT UNTIL STARTX;KEY IS PRESSED AND THEN X;CONTINUEX; START CR CR$>MSG11%>MSG11-} PRINT START1QR>& HSTART10::X;DX;N$X;SUBROUTINE TO PRINT A STRING OFX X;THE LENGTH INDICATED BY TH-}Eb X;CONTENTS OF THE ACCUMULATORl*X;X REG HOLDS LO BYTE OF STRING ADDRESSv*X;Y REG HOLDS HI BYTE OF STRING ADDRESSX; -}PRINTLEN PICBLLQ> PICBLH &ICBAL 'ICBAHQ>  PICCOM$> CIOV:X;X;STRING ADDRESSX; ,gPPLXVR P`DE BHI V` P PQ P`HIDE B V`A + B = A - B = A * B = A / B = }1}ӠŠԠΠNATURAL LOG OF A = BASE 10 LOG OF A = SQUARE ROOT OF A = A^B = } ******************1}********PQ****** * FLOATING POINT MACRO LIBRARY * * * * by: Louis J. Chorich III 2}* * From ANTIC, The Atari Resource * * DEMONSTRATION *PRESS START TO CONTINUE...}BASIC ARITHMETIC OPERAT2}IONS *******QR*************************ENTER FP NUMBER A:ENTER FP NUMBER B:This program demonstrates the use of the m2}acros contained in the FP Macro Library.It is divided into sections which demonstrate the various capabilitesof the Li2}brary.INVERSE NATURSRAL LOG OF B=INVERSE BASE 10 LOG OF B=A^B =A IS GREATER THAN BA IS LESS THAN BA IS EQUAL TO BUSING2} THE BIEQ, BIGT, AND BILT MACROS,I HAVE DETERMINED THAT}THE NUMBERS YOU ENTERED ARE:A = B = }Here is an array of 10 FP numb2}ers.When you press START,ST I'll take the two numbers (A & B) you previouslyentered and insert them into elements 3 and2} 9 of the floating point array.}Here's the new array:Do you see the numbers you entered at elements 3 and 9 of the array?I2}f you examine the FPDEMO.M65 souTUrce code, you'll notice that only one callto the PRINTFP macro is necessary to print al2}l ten numbers. It is put in aloop.Element #1: @@V4@3330?E?%AT2@`K`":UU@HI2 }DE B V`HIDEB V`U$VWVRWߠP PQ 2 }PQ P'Q PKQ P'Q PoQ P'Q PQ P P P8R P PR PנR P $PҠQ P P PR PHHH UHHH2 } آU hhhhhh P%R PHHH UHHH آU hhhhhh PHHHUhhhHHHSWNXUh2 }hh (HHHԝVhhhHHHU ݢU `ڢV hhhHHHU ݢU ڢV hhhHHHU ݢU fڢ V 2 }hhhRP 9PHHHHHH V ݢ ؠ0轁0L Xȹ)ȩhhh Uhhh[P 9PHHHHHHOXJYV2} ݢ ؠ0轁0LfXȹ)ȩhhh UhhhdP 9PHHHHHHV ݢ ؠ0轁0LX2}ȹ)ȩhhh UhhhmP 9PHHHHHHV ݢ ؠ0轁0LYȹ)ȩhhh Uh2}KYFZhh $PvP; 9PHHHU ޢ V hhhHHHHHH V ݢ ؠ0轁0LYȹ)ȩhhh Uh2}hhP 9PHHHU ޢV hhhHHHHHHV ݢ ؠ0轁0LZȹ)ȩhhh Uhhh 2}P PGZB[R 9PHHHU ݢV hhhHHHHHHV ݢ ؠ0轁0LZȹ)ȩhhh Uhh2}hS 9PHHHU ݢV hhhHHHHHHV ݢ ؠ0轁0L[ȹ)ȩhhh Uhhh P 2}PؠP 9PHC[>\HHU HHHUhhh ݢV hhhHHHHHHV ݢ ؠ0轁0L[2}ȹ)ȩhhh Uhhh PĠP 9PHHHU HHH轱Uhhh ( ݢV hhhHHHHHHV ݢ 2}ؠ0轁?\:]0L:\ȹ)ȩhhh Uhhh $PS P PS 9PHHHHHHU ݢ ؠ0轁2}0L\ȹ)ȩhhh UhhhS 9PHHHHHHU ݢ ؠ0轁0L\ȹ)ȩhhh2} Uhhh P PHHHH;]6^HHHHHU ݢU `ڢ hhh0Ls]L]L]hhhhhhLe^hhhHH2}HHHHHHHU ݢU `ڢ hhh0L]L]L]hhhhhhLo^hhhHHHHHHHHHU ݢU2} `ڢ hhh0L=^7^2_LJ^LJ^hhhhhhLy^hhhDS PL^S PL^3S P $PS P P0rU2}WVrUWVHHHWVuUiL^L^ȱVhhhiU 9PHHHHHHV ݢ ؠ0轁2}0L _ȹ)ȩhhh 3_.`UhhhWV L^WVHHHWVuUiLw_Lk_ȹUhhh2} WVHHHWVuUiL_L_ȹUhhh P۠S P$T P $PoT P P0rUWVrUWVHHHWV2}uUiL*`L`ȱ/``UhhhiU 9PHHHHHHU ݢ ؠ0轁0Lg`ȹ)2}ȩhhh UhhhWV L_``ȱ/``UhhhiU 9PHHHHHHU ݢ ؠ0轁0Lg`ȹ)0$PPL$S@@@e@W2@W)WyQcP3P ݢP 6!}P ݢ?P ݢ P ݢ3P ݢ3P ݢ9P `ڢP ڢP ݢ P ݢEP ڢP ݢ?P fڢP ݢPP 6"}(ۢP P3QݢP fڢP ݢ P ݢ?P fڢ P ݭcP `cPLP4QqQ@HIDE B V`HIDE6#}B V`rQmRENTER AN ANGLE (0-360) }THE SINE IS THE COSINE IS THE TANGENT IS THE COTANGENT IS T6$}HE SECANT IS THE COSECANT IS THE ANGLE IN DEGREES IS THE ANGLE IN RADIANS IS PRESS START FOR DOS} ********************6%}************ nRiS* * * TRIG MACRO LIBRAY * * by: Louis J. Chorich III 6&} * * From ANTIC, The Atari Resource * ********************************GR SXlR SXR SXlR SXR SXlR SX۠R SX6'}lR SXS SX KX KX jSeTKXQ XHHH SQHHH آxQ hhhhhh]P ݢxQ (ۢrQ KX KXQ XrQ 6(}ݢ3P dPP ݢ~Q HHHHHH~Q ݢ ؠ0轁0L Tȹ)ȩhhh :QhhhQ XQP 6)}EP (ۢrQ `ڢP fTaUP ݢ3P dPP ݢ~Q HHHHHH~Q ݢ ؠ0轁0LTȹ)ȩ6*}hhh :QhhhQ XrQ ݢ3P dPP ݢ-P ݢWP ݢrQ `ڢ3P dPP ݢ-P (ۢ~Q HHHHHH~Q6+} ݢ ؠ0轁0LVUbU]Vȹ)ȩhhh :QhhhРQ XrQ ݢ3P dPP ݢ-P ݢWP ݢrQ 6,} `ڢ3P dPP ݢ-P (ۢ ݢ?P (ۢ~Q HHHHHH~Q ݢ ؠ0轁0LVȹ)ȩhhh6-} :QhhhQ XQP ݢEP (^VYWۢrQ `ڢP ݢP ݢ3P dPP ݢ ݢ?P (ۢ~Q HHHHHH~Q 6.}ݢ ؠ0轁0LVȹ)ȩhhh :QhhhQ XrQ ݢ3P dPP ݢ ݢ?P (ۢ~Q H6/}HHHHH~Q ݢ ؠ0轁0LOZWUXWȹ)ȩhhh :Qhhh KX KXR XHHHHHHxQ ݢ 60}0轁0LWȹ)ȩhhh :Qhhh KXR XHHHHHHrQ ݢ ؠ0轁0LXȹ)61}ȩhhh :Qhhh KX KX lX`JX SX`DVXXE BHI V` KX KX3R SX`HIDE B V`)4{A @ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"#$%&'()<>-_=|+\*^,.[]/?;:111111111111111111111111111111333313313333313331313331313>3}33133331131131133333131331331333133331133131133333331133131131133331131131333331331333331331333313113113133311311311331333331>4}33133313133133113113113113333133333133133133333133133133133333133133133333313133313113113333133133113333313133313133133333113>5}33113333333131131131131313313313313333313313313313131313313313333313313313131313313313313131131131333113131311333131131131131>6}13133111313131133333311333311333331131131133313133331133111333131131133331333333311313131131133331333331333333331333311311313>7}13133133131311311311311111313133131111111113133333133333133133113131133133111131313111131313131313131331311311111111111313113>8}11311131131113113113131113131311131113311131113131311111111333111111111111111111333111333111333111131131131131131111131333131>9}11111131113111311131313133313131311113131331311111111111113113111111111113313333131131131133113311311311313311111313131111133>:}3113131111131111131111131131111131111131111#$%&'()<>-_=|+\*^,.[]/?;:111111111111111111111111111111333313313333313331313331313<+) @ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-.?333333333333333333333333333333333333333333333333333332223232323232223232333332233B<}23232233232322333333222323332333233322233333223323232323232322333333222323332233233322233333222323332233233323333333222323332B=}33323232223333323232323222323232323333322233233323332332223333333233323332323232223333323232323223323232323333323332333233323B>}33222333332323222323232323232333332223232323232323232333332223232323232323222333332233232322332333233333332223232323232333222B?}33333223323232233232323233333222323332223332322233333222332333233323332333333232323232323232322233333232323232323232332333333B@}23232323232322232323333323232323323323232323333323232323323332333233333322233323323323332223333332333233323332333233333322333BA}32332332333222333332223332322233323222333332333233323332223323333332223233322333323223333332333233322232323222333332223332332BB}33233323333333222323232223232322233333222323232223332333233333323323232323232332333333333333332223333333333333333333333333223BC}3223333332223332332333333323XYZ1234567890-.?333333333333333333333333333333333333333333333333333332223232323232223232333332233@B A SEQ1M CASTLE17 2M LANDING7 1M TURRET6 30M ANTIC6 30M TURRETD6 30M TURRETB6 30M CLEAR6 30M TURRETBD6 30M FE}TURRET6 30M TITLE6 30M TURRETD6 30M TURRETC6 30M AUTHOR6 30M TURRETCD TURRETB6 30M CLEAR6 30M TURRETBD6 30M DPB A SEQ26 30M TURRETB6 30M CLEAR6 30M TURRETBD7 1M MENU7 18 0 198 2 68 1 198 6 68 2 22 4 26 30M SELECT1M SELECJG}T28 0 0 0 08 1 0 0 08 2 0 0 0T A6 30M TURRETBD7 1M MENU7 18 0 198 2 68 1 198 6 68 2 22 4 26 30M SELECT1M SELECH%* ANTIC* MAGAZINE.* THE ATARI* RESOURCE.** BUILD WORK MACROS*B M W1 FLASH IN CHARACTERQ #0 #1#3 E 1I #2 ANTIC*ENI}#3 E 2I #2 MAGAZINE,*E#3 E 3I #2 THEATARI*E#3 E 4I #2 RESOURCE.*E#2 + 1#0 + 1#1 + 5Q #0 #1C 2I L 27 42O X3M NJ}RAYGUN.SNDO FVL BC 1I L 27 42#0 + 3#1 - 5T M*B M W2 PAUSE BETWEEN LINES#2 = 1#1 + 6#3 + 1O X36 30O FVL BTNK} M** INITIAL SET UP*L U CHAR31L C CASTLE1VL BB A ANTICM TURRETA6 30*#2 = 1 CHARACTER#3 = 1 WORD#0 = 12 COLNL}UMN#1 = 8 ROWR W1 5R W2#0 = 12R W1 9R W2#0 = 16R W1 3#0 + 4R W1 5#0 = 16R W2R W1 9R W2M TURRETAD6 30TX W1NM}.PGMX W2.PGML C CASTLEL X ANTICESOURCE.** BUILD WORK MACROS*B M W1 FLASH IN CHARACTERQ #0 #1#3 E 1I #2 ANTIC*EL#* LANDING SEQUENCE* WITHOUT LANDING GEAR* WHICH WAS CREATED BY HAND*B M W1 ONE LANDING CYCLEVNI C @3J D #0W CO B3RO}6 #1O F#0 + 1#1 + #2#3 + 1#3 > 67#3 = 65*ET M* INITIAL SEQUENCEL U SHIPL C CASTLE1Q 20 84#0 = 1 STARTING JUMPRP}#1 = 5 STARTING DELAY#2 = 0.2 TIMER INCREMENT#3 = 65 ASCI "A"B A SHIPR W1 58T AX W1.PGML C CASTLE1L X SHIPO B3Pw* MENU** BUILD WORK MACROS*B M W1 FLASH IN CHARACTERQ #0 #1#3 E 1I #2 1-EDITOR*E#3 E 2I #2 2-MAPPER*E#3 E 3I #VR}2 3-BUILDER*E#3 E 4I #2 4-BUFFER*E#2 + 1#0 + 1#1 + 5Q #0 #1C 2I L 27 42O X3M RAYGUN.SNDO FVL BC 1I L 27 42VS}#0 + 3#1 - 5T M*B M W2 PAUSE BETWEEN LINES#2 = 1#1 + 6#3 + 1#0 = 16O X36 30O FVL BT M** INITIAL SET UP*L UVT} CHAR31L C CASTLE1VL BB A MENUM TURRETA6 30*#2 = 1 CHARACTER#3 = 1 WORD#0 = 16 COLUMN#1 = 8 ROWR W1 8R W2VU}R W1 8R W2R W1 9R W2R W1 8R W2M TURRETAD6 30TX W1.PGMX W2.PGML C CASTLE1L X MENUE 2I #2 2-MAPPER*E#3 E 3I #T^* DRAGONS TAIL.* VOLUME 2.* GRAPHICS** BUILD WORK MACROS*B M W1 ZAP IN CHARACTERQ #0 #1#3 E 1I #2 DRAGONS TAIL.ZW}*E#3 E 2I #2 VOLUME TWO. *E#3 E 3I #2 GRAPHICS. *E#2 + 1#1 + 6C 3Q #0 #1#0 + 3I L #0 #1#1 + 1#0 - 2Q #0 ZX}#1C 2I L 27 42O X3M RAYGUN.SNDO FVL BC 1I L 27 42#0 + 3#1 - 7T M*B M W2 PAUSE BETWEEN LINESO X36 30O FZY}VL B#0 = 8#1 + 6#3 + 1#2 = 1T M** INITIAL SET UP*#0 = 8 COLUMN#1 = 8 ROW#2 = 1 CHARACTER#3 = 1 LINEL U CHAR23LZZ} C CASTLE1VL B** BUILD FILE*B A TITLEM TURRETA6 30R W1 14R W2R W1 14R W2R W1 14R W2M TURRETAD6 30T AX W1.PGZ[}MX W2.PGML C CASTLE1L X TITLEPHICS** BUILD WORK MACROS*B M W1 ZAP IN CHARACTERQ #0 #1#3 E 1I #2 DRAGONS TAIL.X!* LEFT MOVEMENT OF* SELECT AND CHOPPERS*B M W1Q #0 1VNI C AZ D 1Z U 2O B36 3O FVNI C BZ D 1Z U 2O B36 3^]}O F#0 - 1T M*#0 = 79L C CASTLE1L U CHOPPERHVL BB A SELECT1R W1 77T AX W1.PGMVL X SELECT1Z D 1Z U 2O B36 3\g* CHOPPER DECENT*B M W1VJ D 136 3T M*B M W2J U 1W C36 3VT M*B M W3J U 1W C36 6T M**L C CASTLE1L U Cb_}HOPPERHNQ 80 0C 1I R 143 7Q 83 1I C AVL BI C BO XB A SELECT2R W1 10VQ 91 12I L 96 12Q 126 12I L 130 12Q 96 b`}6C 0I R 127 11Q 80 5I L 143 536 3V36 3VQ 96 12I L 127 12C 1Q 80 13I L 95 13Q 128 13I L 144 13R W2 16R W3 5ba}T AX W1.PGMX W2.PGMX W3.PGML C CASTLEL X SELECT1L X SELECT23VT M*B M W3J U 1W C36 6T M**L C CASTLE1L U C`C* AUTHOR*B M W1Q #0 #1#3 E 1I #2 BY *E#3 E 2I #2 ED CHURNSIDE *E#3 E 3I #2 C. 1986. *E#2 + 1#1 + 6Q #0 #1Ifc} S 3333#0 + 4#1 - 6Q #0 #1M FLASH36 8NT M*#0 = 8#1 = 63#2 = 1#3 = 1L U CHAR23L C CASTLE1NB A AUTHORM TURRETfd}CR W1 46 30#1 + 7#2 = 1#3 + 1#0 = 8R W1 146 30#1 + 7#2 = 1#3 + 1#0 = 28R W1 96 30M TURRETCDT AX W1.PGML C Cfe}ASTLE1L X AUTHORQ #0 #1#3 E 1I #2 BY *E#3 E 2I #2 ED CHURNSIDE *E#3 E 3I #2 C. 1986. *E#2 + 1#1 + 6Q #0 #1Id   #0 #1#3 E 1I #2 BY *E#3 E 2I #2 ED CHURNSIDE *E#3 E 3I #2 C. 1986. *E#2 + 1#1 + 6Q #0 #1IhFUUW'U_&U&U%UWUUWUU_UU_UUzWUUUUzz^UUzWUU]UUzz^UUnh}U^gfUUzU UU]UUzU UU^gfUUUUU]UU_ꪪU_ꯪUU^ffUUWUU]Uni}zUU^ffUzUUWUzUWꯪUWUUWUWUꪪUWUWUꪪUWUWnj}UUꪪUWU_UꪪUWUyUꪪUWUUꪪUꪪUzUz ꪪUz nk}Uz UWUUQUWUU@UWUUUWUUUWUU Unl}@UWUUUTUUUUUUUU PAPUUUT @꺪UU@@UPnm} UUQPUP  @UTqPU@꺪3$ U0PU]\\5s5꺪nn}3 0  3  P3 T3 UU@3no}UP3U3UU@3UT3UUUT3E@U3Unp}UU3T UTȨ3 P UT?}@N"@6-@X? A$6-?:<<%@`<,?6-?:<<A<@ ,b3-,6-?:<<>}%<%A($,0 3$SAVE SCREEN TO DISK'6-Av"@#'6-A8@-6-?:<<<,-6-?:<A<<@>} ,< +'0@@@9@@<(>,($CONVERT 08/14/86 (C) 1986>@@>} ( ( (ŠΠϠˠ(  6.SCR A** A*@@4GRAPH>}ICS COMMAND>)()(ŠӠĠٯΩH 6.YN6-?:<,R@A"\#6-@x# @>}A!pf$($(נԠנٯΩp6-?:<,z6-*@# 6-"@#6-&@>}*@ COLORS( (ŠҠӠٯΩ6-?:<,"@xA#((ŠҠ>}ӿ 6.596-?:<,U"@S6-@(*@K6-?:<@<%@<@,U A#76-@>}*@76-?:<@<<@ , SCREEN A 6-?:<<A<@ , 6-?:<<<,$ 6-?:>}<@<<A0,. @$(# INIT2# B<#GG;A0,;Av,;@,;@ ,;@,;@>} ,F#0 6-C:,6-C:,6-C:,'6-C:,06-C:,P#$ N DT1*Ng6-A#;,6-C:,+6-Aa;6. D:DT1.>}OBJJ6-?:<<<,gF:A,@B 4N6-%@6-%A-6-%AC;6-%ApI6-%A`W6->}%Ae6-%As6-%A6-%A>Ns6-%A&6-%A@-6-%AF;6-%ARI6-%A8>}W6-%Are6-%Axs6-%A"6R DT2R[6-A;,6-C:,/6. D1:GF.OBJ>6-?:<<<,[F:A,>}@B Rk 6-6-%@t%6-%AW36-%AA6-%AbO6-%A8]6-%Ak6-%Ax>}S DT3T\6-As;,6-C:,06. D1:GF2.OBJ?6-?:<<<,\F:A,@B T 6-6-%@W$>}U ERRORU(( ĠҠV B  D:CONVERT.BASSECBUPSECPADLMOVSAPBYTSCRBBUFSAVCDT1QLOAQ<Egak haliamg  ,*lonqj'ospt2qurvCRvt xusyoszw {1xv|ov}zT*{y*|y*}y*~y~y*y o oTy0Sm*T** oT:&  oRT&=0SmO{wB@DDwABGDgCBDABBD\*p#) COD BDBD{BDB%kB(O?OO %x`0 3 h ABDqCA D $DDB"DB#DQB$D#oBpBC#qBKrB"DBDCBD3BDCC1DX A DBCD1BDBD2^fed%c2a%`%, MM# B=D%]1~DBD BC3D*BDC6D| 0| 0~X$-D*0 !  wO |&6+0 +; o +"N9A.Gi+O !f "##!$>+%R#&-0C!%(-#" )=!*`%$ +?#,a'& -A%.b)( /C'0c+* 1E)2d-, 3H+4e/. 5J-6f10 7L/8g32 9N1:h54 ;P3<i76 =5>q98 ?C7=Cs;: A9Bt< C;v"E@+F$GB+H&ID+J(KI+L*M)NOW,PK+Q.RM+S0TO+U2VQ+W4X+YS#rTR[US\VS]WS^XS_YS`ZSa[Sb\Sc]Sd^Se_Sf`SgaShbSicSjdSkeSlfSmgSnhSoiSpjSqkSrlSsmStnSuoSvpSwqSxSysRztr{ur|vr}wr~xryrzr{r|r}r~rG TYPING TUTOR LOADING WORD INVADERS ԍ/@Ԣ _ "/` N݆LL``8 eLx 8 `L ȅFƐ ee&L `إ*ِ`ʠ`ACADEMY SOFTWA ԩ s 5ө ԩ s  ө ԩ s `HƩ( heee e`H 8 h` 8 ` 8 )eiZ ~ * .(   $ CRDSD ,:8s+-+#%{0++ 6 <  /8<++++ + (DTD+-o/<o12#3'o45C6o7(8o91:=%>?$@A%B:C:D%EFGWHuIJ6BKL M#N! OPPQ2t:FB%DDnB#BB.BTlBU5-t#DAD8MjBC7DDB;DAD  5   5 P 55. r  % #pq t# js u